using System;
using System.Web;

using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Common;

[assembly: WebActivator.PreApplicationStartMethod(typeof(MVCBootstrap.Ninject.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(MVCBootstrap.Ninject.App_Start.NinjectWebCommon), "Stop")]

namespace MVCBootstrap.Ninject.App_Start {

	public static class NinjectWebCommon {
		private static readonly Bootstrapper bootstrapper = new Bootstrapper();

		//        /// <summary>
		//        /// Starts the application
		//        /// </summary>
		public static void Start() {
			DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
			DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
			bootstrapper.Initialize(CreateKernel);
		}

		/// <summary>
		/// Stops the application.
		/// </summary>
		public static void Stop() {
			bootstrapper.ShutDown();
		}

		/// <summary>
		/// Creates the kernel that will manage your application.
		/// </summary>
		/// <returns>The created kernel.</returns>
		private static IKernel CreateKernel() {
			var kernel = new StandardKernel(new NinjectSettings { UseReflectionBasedInjection = true });
			kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
			kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

			//kernel.Bind<YourDbContext>().To<YourDbContext>().InRequestScope().WithConstructorArgument("nameOrConnectionString", ConfigurationManager.ConnectionString["whatever"].ConnectionString);

			//RegisterServices(kernel);
			return kernel;
		}

		//        /// <summary>
		//        /// Load your modules or register your services here!
		//        /// </summary>
		//        /// <param name="kernel">The kernel.</param>
		//        private static void RegisterServices(IKernel kernel) {
		//        }
	}
}